/*
  client.js
  前端使用此connect函数建立websocket连接
*/

/**
 * 建立websocket连接
 * host: 服务器名称（将会连接到ws://host）
 * joinCallback: 加入房间回调函数（加入成功传入{join:true,status:'房间状态'}，加入失败传入{join:false,status:'房间状态'}）
 *   房间状态: available: 未满且游戏未开始; started: 未满且游戏已开始; full: 已满
 * gameStartStopCallback: 游戏开始结束回调函数（开始或中途加入传入true，结束传入false）
 * gameCallback: 游戏消息回调函数（传入接收到的消息）
 * closeCallback: 连接断开回调函数
 * 返回连接对象: {
 *   ready: 玩家准备就绪函数,
 *   cancel: 玩家取消准备函数,
 *   send: 发送消息函数（传入要发送的消息）,
 * }
 */
function connect(host, joinCallback, gameStartStopCallback, gameCallback, closeCallback) {
  const socket = new WebSocket('ws://' + host)
  let joined = false
  let started = false
  socket.onmessage = event => {
    let obj
    try {
      obj = JSON.parse(event.data)
    } catch (e) {
      return
    }
    switch (obj.type) {
      case 'join':
        if (obj.data.join) {
          joined = true
        } else {
          socket.close()
        }
        if (obj.data.join && obj.data.status == 'started') {
          started = true
          joinCallback(obj.data)
          gameStartStopCallback(true)
        } else {
          joinCallback(obj.data)
        }
        break
      case 'start':
        started = true
        gameStartStopCallback(true)
        break
      case 'stop':
        started = false
        gameStartStopCallback(false)
        break
      case 'game':
        if (joined) {
          gameCallback(obj.data)
        }
        break
    }
  }
  socket.onclose = () => {
    closeCallback()
  }
  return {
    ready() {
      if (joined && !started) {
        socket.send('{"type":"ready"}')
      }
    },
    cancel() {
      if (joined && !started) {
        socket.send('{"type":"cancel"}')
      }
    },
    send(message) {
      if (joined && started) {
        socket.send(JSON.stringify({ type: 'game', data: message }))
      }
    }
  }
}
